/* * Copyright (c) 2008-2011 EMC Corporation * All Rights Reserved */ package com.emc.storageos.services.util; import org.slf4j.LoggerFactory; import java.io.IOException; import javax.management.ListenerNotFoundException; import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.management.remote.JMXConnector; import javax.management.remote.JMXServiceURL; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.MBeanServer; import java.lang.management.ManagementFactory; import java.rmi.registry.LocateRegistry; public class JmxServerWrapper { private static final org.slf4j.Logger log = LoggerFactory.getLogger(JmxServerWrapper.class); private int _jmxRemotePort; private int _jmxRemoteExportPort; private String _jmxHost; private String _jmxFmtUrl; private boolean _jmxEnabled; private JmxServerWrapper _jmxServer; private JMXConnectorServer _jmxRemoteServer; private JMXConnector jmxc; public JmxServerWrapper() { } /** * JMX enabled or not */ public void setEnabled(boolean jmxEnabled) { _jmxEnabled = jmxEnabled; } public boolean getEnabled() { return _jmxEnabled; } /** * JMX service url format */ public void setServiceUrl(String serviceUrl) { _jmxFmtUrl = serviceUrl; } public String getServiceUrl() { return _jmxFmtUrl; } /** * JMX remote port */ public void setPort(int jmxRemotePort) { _jmxRemotePort = jmxRemotePort; } public int getPort() { return _jmxRemotePort; } /** * JMX Export Port for Remote Objects (RMIServer and RMIConnection etc.) */ public void setExportPort(int jmxRemoteExportPort) { _jmxRemoteExportPort = jmxRemoteExportPort; } public int getExportPort() { return _jmxRemoteExportPort; } /** * JMX remote host */ public void setHost(String jmxHost) { _jmxHost = jmxHost; } public String getHost() { return _jmxHost; } public void start() throws Exception { log.debug("JMX server wrapper: jmx enabled ={} ", _jmxEnabled); if (_jmxEnabled) { try { LocateRegistry.createRegistry(_jmxRemotePort); log.info("start bind JMX to {}:{} serviceurl: {}", new Object[] { _jmxHost, _jmxRemotePort, _jmxFmtUrl}); JMXServiceURL jmxUrl = new JMXServiceURL(String.format(_jmxFmtUrl, _jmxRemoteExportPort, _jmxHost, _jmxRemotePort)); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); _jmxRemoteServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxUrl, null, mbs); _jmxRemoteServer.start(); jmxc = _jmxRemoteServer.toJMXConnector(null); } catch (Exception e) { log.error("JMX server startup failed", e); throw e; } } } public void stop() { if (_jmxEnabled) { try { _jmxRemoteServer.stop(); } catch (IOException e) { log.error("Exception happens when stop JMX server", e); } } } public void addConnectionNotificiationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IOException { jmxc.addConnectionNotificationListener(listener, filter, handback); } public void removeConnectionNotificationListener(NotificationListener listener) throws ListenerNotFoundException, IOException { jmxc.removeConnectionNotificationListener(listener); } }